
package HibernateLayer;

import POJOs.SCRUDBasic;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author fabiofurlan
 */
public abstract class VRelationBasicServices<STRUCT extends SCRUDBasic, STRUCTB extends SCRUDBasic> extends VCRUDBasicServices<STRUCTB>{

        Class<STRUCT> typer=getTypeClassr();

        public List<STRUCTB> listForeign(STRUCT val){
        try {
            //Queste due righe vanno fattorizzate in un metodo apposito.
            Transaction trx=this.sessionBean.beginTransaction();
            System.out.println("VRelationBasicServices | listForeign | Session-Transaction init.......DONE");

            //Importante: this.type.getName si può fare per il semplice fatto che il campo della relazione in worker ha il nome
            //della struttura esterna, quindi è considerata best practice all'interno dei bean POJO di indicare i campi chiavi esterne
            //con il nome del tipo. Se ciò non fosse non si protrebbe sfruttare la reflecion del type.

            System.out.println("VRelationBasicServices | listForeign | STRUCT="+this.type.getSimpleName());
            System.out.println("VRelationBasicServices | listForeign | STRUCTB="+this.typer.getSimpleName());
            List<STRUCTB> clientList=   this.sessionBean.createCriteria(type).
                                        add(Restrictions.eq(this.typer.getSimpleName(), val)).
                                        list();
    
            trx.commit();
            return clientList;

        } catch (Exception e) {
             e.printStackTrace();
            return null;
        }
    }

    //http://nileshk.com/node/66 there is an example of
    //general parameter reflaction, but this example doesn't work propertly
    //TODO: using reflaction.
    protected abstract Class<STRUCT> getTypeClassr();

}
